package com.brillilab.service.module.netease;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

/**
 * 网易云信
 * @author lj
 *
 */
@Component
public class NeteaseIm {

	@Autowired
	private NeteaseApiHelper neteaseApiHelper;
	
	/**
	 * 网易云通信ID(创建用户)
	 * @param accid 是 	云信ID，最大长度32字符，必须保证一个 APP内唯一（只允许字母、数字、半角下划线_、 @、半角点以及半角-组成，
	 * 				不区分大小写， 会统一小写处理，请注意以此接口返回结果中的accid为准）。
	 * @param name	否 	云信ID昵称，最大长度64字符，用来PUSH推送 时显示的昵称
	 * @param icon	否 	云信ID头像URL，第三方可选填，最大长度1024
	 * @throws Exception 
	 * 参考文档：https://dev.yunxin.163.com/docs/product/IM即时通讯/服务端API文档/网易云通信ID
	 */
	public JSONObject createUser(String accid,String name,String icon) throws Exception{
		String apiUrl = "https://api.netease.im/nimserver/user/create.action";
		Map<String,String> paramMap = new HashMap<>();
			paramMap.put("accid", accid);
		if(StringUtils.isNotBlank(name))
			paramMap.put("name", name);
		if(StringUtils.isNotBlank(icon))
			paramMap.put("icon", icon);
		JSONObject jsonObj = neteaseApiHelper.api(apiUrl, paramMap);
		return jsonObj;
	}
	
	/**
	 * 网易云通信ID更新
	 * @param accid 是	网易云通信ID
	 * @param token 否	网易云通信ID可以指定登录token值，最大长度128字符
	 * @return
	 * @throws Exception
	 */
	public JSONObject update(String accid,String token) throws Exception{
		String apiUrl = "https://api.netease.im/nimserver/user/updateInfo.action";
		Map<String,String> paramMap = new HashMap<>();
			paramMap.put("accid", accid);
		if(StringUtils.isNotBlank(token))
			paramMap.put("token", token);
		JSONObject jsonObj = neteaseApiHelper.api(apiUrl, paramMap);
		return jsonObj;
	}
	
	/**
	 * 更新并获取新token
	 * 一般用于网易云通信ID修改密码，找回密码或者第三方有需求获取新的token
	 * @param accid 是	网易云通信ID
	 * @return
	 * @throws Exception
	 */
	public JSONObject refreshToken(String accid) throws Exception{
		String apiUrl = "https://api.netease.im/nimserver/user/refreshToken.action";
		Map<String,String> paramMap = new HashMap<>();
		paramMap.put("accid", accid);
		JSONObject jsonObj = neteaseApiHelper.api(apiUrl, paramMap);
		return jsonObj;
	}
	
	
	/**
	 * 更新用户名片
	 * @param accid 是
	 * @param name	否 	云信ID昵称，最大长度64字符，用来PUSH推送 时显示的昵称
	 * @param icon	否	 云信ID头像URL，第三方可选填，最大长度1024
	 * @throws Exception 
	 * 参考文档：https://dev.yunxin.163.com/docs/product/IM即时通讯/服务端API文档/用户名片
	 */
	public JSONObject updateUinfo(String accid,String name,String icon) throws Exception{
		String apiUrl = "https://api.netease.im/nimserver/user/updateUinfo.action";
		Map<String,String> paramMap = new HashMap<>();
		paramMap.put("accid", accid);
		if(StringUtils.isNotBlank(name))
			paramMap.put("name", name);
		if(StringUtils.isNotBlank(icon))
			paramMap.put("icon", icon);
		JSONObject jsonObj = neteaseApiHelper.api(apiUrl, paramMap);
		return jsonObj;
	}
	
	/**
	 * 获取用户名片
	 * @param accids 是  	用户帐号（例如：JSONArray对应的accid串，如：["zhangsan"]，如果解析出错，会报414）（一次查询最多为200）
	 * @return
	 * @throws Exception
	 * 参考文档：https://dev.yunxin.163.com/docs/product/IM即时通讯/服务端API文档/用户名片
	 */
	public JSONObject getUinfos(JSONArray accids) throws Exception{
		String apiUrl = "https://api.netease.im/nimserver/user/getUinfos.action";
		Map<String,String> paramMap = new HashMap<>();
		paramMap.put("accids", accids.toString());
		JSONObject jsonObj = neteaseApiHelper.api(apiUrl, paramMap);
		return jsonObj;
	}
	
	/**
	 * 设置桌面端在线时，移动端是否需要推送
	 * @param accid	是 
	 * @param donnopOpen 是 	true:移动端不需要推送，false:移动端需要推送
	 * @return
	 * @throws Exception
	 * 参考文档：https://dev.yunxin.163.com/docs/product/IM即时通讯/服务端API文档/用户设置
	 */
	public JSONObject setDonnop(String accid,Boolean donnopOpen) throws Exception{
		String apiUrl = "https://api.netease.im/nimserver/user/setDonnop.action";
		Map<String,String> paramMap = new HashMap<>();
		paramMap.put("accids", accid);
		paramMap.put("donnopOpen", String.valueOf(donnopOpen));
		JSONObject jsonObj = neteaseApiHelper.api(apiUrl, paramMap);
		return jsonObj;
	}
	/**
	 * 账号全局禁言	
	 * 设置或取消账号的全局禁言状态； 账号被设置为全局禁言后，不能发送“点对点”、“群”、“聊天室”消息
	 * @param accid 是 
	 * @param mute  是 	true：全局禁言，false:取消全局禁言
	 * @return
	 * @throws Exception
	 * 参考文档：https://dev.yunxin.163.com/docs/product/IM即时通讯/服务端API文档/用户设置
	 */
	public JSONObject mute(String accid,Boolean mute) throws Exception{
		String apiUrl = "https://api.netease.im/nimserver/user/mute.action";
		Map<String,String> paramMap = new HashMap<>();
		paramMap.put("accids", accid);
		paramMap.put("mute", String.valueOf(mute));
		JSONObject jsonObj = neteaseApiHelper.api(apiUrl, paramMap);
		return jsonObj;
	}
	
	/**
	 * 加好友
	 * @param accid	是 	加好友发起者accid
	 * @param faccid 	是 加好友接收者accid
	 * @param type 是 	1-直接加好友，2-请求加好友，3-同意加好友，4-拒绝加好友
	 * @param msg 否 		加好友对应的请求消息，第三方组装，最长256字符
	 * @return
	 * @throws Exception
	 * 参考文档：https://dev.yunxin.163.com/docs/product/IM即时通讯/服务端API文档/用户关系托管
	 */
	public JSONObject addFriend(String accid,String faccid,Integer type,String msg) throws Exception{
		String apiUrl = "https://api.netease.im/nimserver/friend/save.action";
		Map<String,String> paramMap = new HashMap<>();
		paramMap.put("accids", accid);
		paramMap.put("faccid", faccid);
		paramMap.put("type", String.valueOf(type));
		paramMap.put("msg", msg);
		JSONObject jsonObj = neteaseApiHelper.api(apiUrl, paramMap);
		return jsonObj;
	}
	
	/**
	 * 更新好友相关信息
	 * @param accid	是 	加好友发起者accid
	 * @param faccid 是 	要修改朋友的accid
	 * @param alias 否 	给好友增加备注名，限制长度128
	 * @return
	 * @throws Exception
	 * 参考文档：https://dev.yunxin.163.com/docs/product/IM即时通讯/服务端API文档/用户关系托管
	 */
	public JSONObject updateFriend(String accid,String faccid,String alias) throws Exception{
		String apiUrl = "https://api.netease.im/nimserver/friend/updateInfo.action";
		Map<String,String> paramMap = new HashMap<>();
		paramMap.put("accids", accid);
		paramMap.put("faccid", faccid);
		paramMap.put("msg", alias);
		JSONObject jsonObj = neteaseApiHelper.api(apiUrl, paramMap);
		return jsonObj;
	}
	/**
	 * 删除好友关系
	 * @param accid	是	 加好友发起者accid
	 * @param faccid 是	 要删除朋友的accid
	 * @param alias 否 	给好友增加备注名，限制长度128
	 * @return
	 * @throws Exception
	 * 参考文档：https://dev.yunxin.163.com/docs/product/IM即时通讯/服务端API文档/用户关系托管
	 */
	public JSONObject deleteFriend(String accid,String faccid) throws Exception{
		String apiUrl = "https://api.netease.im/nimserver/friend/delete.action";
		Map<String,String> paramMap = new HashMap<>();
		paramMap.put("accids", accid);
		paramMap.put("faccid", faccid);
		JSONObject jsonObj = neteaseApiHelper.api(apiUrl, paramMap);
		return jsonObj;
	}
	
	/**
	 * 获取好友关系
	 * 查询某时间点起到现在有更新的双向好友
	 * @param accid	是	 加好友发起者accid
	 * @param updatetime 是 	更新时间戳，接口返回该时间戳之后有更新的好友列表
	 * @param createtime 否	创建时间戳，接口返回该时间戳之后有更新的好友列表
	 * @return
	 * @throws Exception
	 * 参考文档：https://dev.yunxin.163.com/docs/product/IM即时通讯/服务端API文档/用户关系托管
	 */
	public JSONObject getFriend(String accid,Long updatetime,Long createtime) throws Exception{
		String apiUrl = "https://api.netease.im/nimserver/friend/get.action";
		Map<String,String> paramMap = new HashMap<>();
		paramMap.put("accids", accid);
		paramMap.put("updatetime", String.valueOf(updatetime));
		paramMap.put("createtime", String.valueOf(createtime));
		JSONObject jsonObj = neteaseApiHelper.api(apiUrl, paramMap);
		return jsonObj;
	}
	

	/**
	 * 设置黑名单/静音
	 * 拉黑/取消拉黑；设置静音/取消静音
	 * @param accid
	 * @param targetAcc 是 	被加黑或加静音的帐号
	 * @param relationType 是	本次操作的关系类型,1:黑名单操作，2:静音列表操作
	 * @param value 是	操作值，0:取消黑名单或静音，1:加入黑名单或静音
	 * @return
	 * @throws Exception
	 * 参考文档：https://dev.yunxin.163.com/docs/product/IM即时通讯/服务端API文档/用户关系托管
	 */
	public JSONObject setSpecialRelation(String accid,String targetAcc,Integer relationType,Integer value) throws Exception{
		String apiUrl = "https://api.netease.im/nimserver/user/setSpecialRelation.action";
		Map<String,String> paramMap = new HashMap<>();
		paramMap.put("accids", accid);
		paramMap.put("targetAcc", targetAcc);
		paramMap.put("relationType", String.valueOf(relationType));
		paramMap.put("value", String.valueOf(value));
		JSONObject jsonObj = neteaseApiHelper.api(apiUrl, paramMap);
		return jsonObj;
	}
	
	/**
	 * 查看用户的黑名单和静音列表
	 * @param accid
	 * @return
	 * @throws Exception
	 * 参考文档：https://dev.yunxin.163.com/docs/product/IM即时通讯/服务端API文档/用户关系托管
	 */
	public JSONObject listBlackAndMuteList(String accid) throws Exception{
		String apiUrl = "https://api.netease.im/nimserver/user/listBlackAndMuteList.action";
		Map<String,String> paramMap = new HashMap<>();
		paramMap.put("accids", accid);
		JSONObject jsonObj = neteaseApiHelper.api(apiUrl, paramMap);
		return jsonObj;
	}
	
	
	/**
	 * 发送普通消息
	 * @param from 是	发送者accid
	 * @param ope 是		0：点对点个人消息，1：群消息（高级群）
	 * @param to 是		ope==0是表示accid即用户id，ope==1表示tid即群id
	 * @param type 是	0 表示文本消息,1 表示图片，2 表示语音，3 表示视频，4 表示地理位置信息，6 表示文件
	 * @param body 是	请参消息示例说明中对应消息的body字段
	 * @return
	 * @throws Exception
	 * 参考文档：https://dev.yunxin.163.com/docs/product/IM即时通讯/服务端API文档/消息功能
	 */
	public JSONObject sendMsg(String from,String ope,String to,Integer type,JSONObject body) throws Exception{
		String apiUrl = "https://api.netease.im/nimserver/msg/sendMsg.action";
		Map<String,String> paramMap = new HashMap<>();
		paramMap.put("from", from);
		paramMap.put("ope", ope);
		paramMap.put("to", to);
		paramMap.put("type", String.valueOf(type));
		paramMap.put("body", body.toString());
		JSONObject jsonObj = neteaseApiHelper.api(apiUrl, paramMap);
		return jsonObj;
	}
	
	/**
	 * 批量发送点对点普通消息
	 * @param fromAccid 是	发送者accid
	 * @param toAccids 是	接收人["aaa","bbb"]（JSONArray对应的accid，如果解析出错，会报414错误），限500人
	 * @param type 是	0 表示文本消息,1 表示图片，2 表示语音，3 表示视频，4 表示地理位置信息，6 表示文件
	 * @param body 是	请参消息示例说明中对应消息的body字段
	 * @return
	 * @throws Exception
	 * 参考文档：https://dev.yunxin.163.com/docs/product/IM即时通讯/服务端API文档/消息功能
	 */
	public JSONObject sendBatchMsg(String fromAccid,JSONArray toAccids,Integer type,JSONObject body) throws Exception{
		String apiUrl = "https://api.netease.im/nimserver/msg/sendBatchMsg.action";
		Map<String,String> paramMap = new HashMap<>();
		paramMap.put("fromAccid", fromAccid);
		paramMap.put("toAccids", toAccids.toString());
		paramMap.put("type", String.valueOf(type));
		paramMap.put("body", body.toString());
		JSONObject jsonObj = neteaseApiHelper.api(apiUrl, paramMap);
		return jsonObj;
	}
	
	/**
	 * 发送自定义系统通知
	 * @param from 是	发送者accid
	 * @param msgtype 是	0：点对点自定义通知，1：群消息自定义通知
	 * @param to 是		msgtype==0是表示accid即用户id，msgtype==1表示tid即群id
	 * @param attach 是	自定义通知内容，第三方组装的字符串，建议是JSON串，最大长度4096字符
	 * @return
	 * @throws Exception
	 * 参考文档：https://dev.yunxin.163.com/docs/product/IM即时通讯/服务端API文档/消息功能
	 */
	public JSONObject sendAttachMsg(String from,Integer msgtype,String to,String attach) throws Exception{
		String apiUrl = "https://api.netease.im/nimserver/msg/sendAttachMsg.action";
		Map<String,String> paramMap = new HashMap<>();
		paramMap.put("from", from);
		paramMap.put("msgtype", String.valueOf(msgtype));
		paramMap.put("to", to);
		paramMap.put("attach", attach);
		JSONObject jsonObj = neteaseApiHelper.api(apiUrl, paramMap);
		return jsonObj;
	}
	
	/**
	 * 批量发送点对点自定义系统通知
	 * @param fromAccid 是	发送者accid
	 * @param toAccids 是	接收人["aaa","bbb"]（JSONArray对应的accid，如果解析出错，会报414错误），最大限500人
	 * @param attach 是		自定义通知内容，第三方组装的字符串，建议是JSON串，最大长度4096字符
	 * @return
	 * @throws Exception
	 * 参考文档：https://dev.yunxin.163.com/docs/product/IM即时通讯/服务端API文档/消息功能
	 */
	public JSONObject sendBatchAttachMsg(String fromAccid,JSONArray toAccids,String attach) throws Exception{
		String apiUrl = "https://api.netease.im/nimserver/msg/sendBatchAttachMsg.action";
		Map<String,String> paramMap = new HashMap<>();
		paramMap.put("fromAccid", fromAccid);
		paramMap.put("toAccids", toAccids.toString());
		paramMap.put("attach", attach);
		JSONObject jsonObj = neteaseApiHelper.api(apiUrl, paramMap);
		return jsonObj;
	}
	
	/**
	 * 单聊云端历史消息查询
	 * @param from 是	发送者accid
	 * @param to 是	接收者accid
	 * @param begintime 是	开始时间，ms
	 * @param endtime 是	截止时间，ms
	 * @param limit 是	本次查询的消息条数上限(最多100条),小于等于0，或者大于100，会提示参数错误
	 * @param reverse 否	1按时间正序排列，2按时间降序排列。其它返回参数414错误。默认是按降序排列
	 * @return
	 * @throws Exception
	 * 参考文档：https://dev.yunxin.163.com/docs/product/IM即时通讯/服务端API文档/历史记录
	 */
	public JSONObject querySessionMsg(String from,String to,Long begintime,Long endtime,Integer limit,Integer reverse) throws Exception{
		String apiUrl = "https://api.netease.im/nimserver/history/querySessionMsg.action";
		Map<String,String> paramMap = new HashMap<>();
		paramMap.put("from", from);
		paramMap.put("to", to);
		paramMap.put("begintime", String.valueOf(begintime));
		paramMap.put("endtime", String.valueOf(endtime));
		paramMap.put("limit", String.valueOf(limit));
		paramMap.put("reverse", String.valueOf(reverse));
		JSONObject jsonObj = neteaseApiHelper.api(apiUrl, paramMap);
		return jsonObj;
	}
	/**
	 * 群聊云端历史消息查询
	 * @param tid 是	群id
	 * @param accid 是	查询用户对应的accid.
	 * @param begintime 是	开始时间，ms
	 * @param endtime 是	截止时间，ms
	 * @param limit 是	本次查询的消息条数上限(最多100条),小于等于0，或者大于100，会提示参数错误
	 * @param reverse 否	1按时间正序排列，2按时间降序排列。其它返回参数414错误。默认是按降序排列
	 * @return
	 * @throws Exception
	 * 参考文档：https://dev.yunxin.163.com/docs/product/IM即时通讯/服务端API文档/历史记录
	 */
	public JSONObject queryTeamMsg(String tid,String accid,Long begintime,Long endtime,Integer limit,Integer reverse) throws Exception{
		String apiUrl = "https://api.netease.im/nimserver/history/queryTeamMsg.action";
		Map<String,String> paramMap = new HashMap<>();
		paramMap.put("tid", tid);
		paramMap.put("accid", accid);
		paramMap.put("begintime", String.valueOf(begintime));
		paramMap.put("endtime", String.valueOf(endtime));
		paramMap.put("limit", String.valueOf(limit));
		paramMap.put("reverse", String.valueOf(reverse));
		JSONObject jsonObj = neteaseApiHelper.api(apiUrl, paramMap);
		return jsonObj;
	}
	
	/**
	 * 用户登录登出事件记录查询
	 * @param accid 是	要查询用户的accid
	 * @param begintime 是	开始时间，ms
	 * @param endtime 是	截止时间，ms
	 * @param limit 是	本次查询的消息条数上限(最多100条),小于等于0，或者大于100，会提示参数错误
	 * @param reverse 否	1按时间正序排列，2按时间降序排列。其它返回参数414错误。默认是按降序排列
	 * @return
	 * @throws Exception
	 */
	public JSONObject querySessionMsg(String accid,Long begintime,Long endtime,Integer limit,Integer reverse) throws Exception{
		String apiUrl = "https://api.netease.im/nimserver/history/queryUserEvents.action";
		Map<String,String> paramMap = new HashMap<>();
		paramMap.put("accid", accid);
		paramMap.put("begintime", String.valueOf(begintime));
		paramMap.put("endtime", String.valueOf(endtime));
		paramMap.put("limit", String.valueOf(limit));
		paramMap.put("limit", String.valueOf(reverse));
		JSONObject jsonObj = neteaseApiHelper.api(apiUrl, paramMap);
		return jsonObj;
	}
	
}
